
package fz.vrd.library.encryption_decryption;

import java.security.MessageDigest;


/**
 * @说明: MD5加密, 不能解密
 * @作者: VinRichard
 * @时间: 2023/7/31 10:23
 * @备注: MD5即Message-Digest Algorithm 5（信息-摘要算法5），用于确保信息传输完整一致。
 * 是计算机广泛使用的杂凑算法之一（又译摘要算法、哈希算法），主流编程语言普遍已有MD5实现。
 * 将数据（如汉字）运算为另一固定长度值，是杂凑算法的基础原理，MD5的前身有MD2、MD3和MD4。
 * 广泛用于加密和解密技术，常用于文件校验。校验？不管文件多大，经过MD5后都能生成唯一的MD5值。
 * 好比现在的ISO校验，都是MD5校验。怎么用？当然是把ISO经过MD5后产生MD5的值。
 * 一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。
 * 就是用来验证文件是否一致的。
 */


public class Md5 implements Factory {

    private final String KEY_MD5 = "MD5";

    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    @Override
    public String decryption(String dec_val) {

        return null;
    }

    @Override
    public String encryption(String value) {
        try {
            MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
            byte[] inputData = value.getBytes();
            md5.update(inputData);
            return bytesToHexFun2(md5.digest());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    String bytesToHexFun2(byte[] bytes) {
        char[] buf = new char[bytes.length * 2];
        int index = 0;
        for (byte b : bytes) { // 利用位运算进行转换
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];//高四位
            buf[index++] = HEX_CHAR[b & 0xf];//低四位
        }
        return new String(buf);
    }
}

